package org.dfg.corejava.jdk8.lumbda;

import java.util.Arrays;
import java.util.Collection;
import java.util.IntSummaryStatistics;
import java.util.Iterator;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.dfg.corejava.jdk8.User;

/*
 * 集合相关
 */
public class CollectionFilter {

	public static void main(String[] args) {
		new CollectionFilter().t6();
	}

	Collection<User> users = Arrays.asList(new User(1, "QQ", 18), new User(2, "WW", 20),
			new User(3, "EE", 22));

	Collection<Integer> nums = Arrays.asList(1, 2, 3, 4);

	public void t1() {
		for (User u : users) {
			// 外部迭代，单线程，效率低
			// u.id = 1;
			System.out.println(u.id);
		}

		/*
		 * 现在是由jdk库来控制循环了,库可以根据运行环境来决定怎么做，并行，乱序或者懒加载方式。
		 * 这就是内部迭代，客户端将行为p.setLastName当做数据传入api里面。
		 */
		users.forEach(u -> u.id = 1);
		users.forEach(System.out::println);
	}

	public void t2() {
		// Stream<User> f = c.stream().filter(e -> e.id==1);
		Stream<User> f = users.parallelStream().filter(e -> e.id == 1);// 多线程执行

		Iterator<User> i = f.iterator();
		while (i.hasNext()) {
			System.out.println(i.next().name);
		}
	}

	public void t3() {
		Predicate<User> p1 = (e) -> e.id > 1;// 闭包的用法
		Predicate<User> p2 = (e) -> e.name.equals("EE");// 可以and
		users.stream().filter((user) -> (p1.and(p2).test(user))).forEach((name) -> {
			System.out.println(name);
		});
	}

	public void t4() {
		nums.stream().map((n) -> n = n * 2).forEach(System.out::println);// map方法，可以改变原对象
		users.stream().map((u) -> u.age = u.age + 1).forEach(System.out::println);
		int s = nums.stream().reduce((sum, n) -> sum + n).get();// 求和
		System.out.println(s);
	}

	public void t5() {
		String s = nums.stream().map(i -> String.valueOf(i)).distinct()
				.collect(Collectors.joining(","));// distinct()过滤
		System.out.println(s);
	}

	public void t6() {
		IntSummaryStatistics ss = nums.stream().mapToInt(n -> n).summaryStatistics();
		System.out.println(ss.getCount());
		System.out.println(ss.getSum());
		System.out.println(ss.getMax());
		System.out.println(ss.getMin());
		System.out.println(ss.getAverage());
	}
}
